package persi.futbol.formacion;

import java.util.ArrayList;
import java.util.List;

import persi.entities.Entidad;
import persi.enums.Posicion;
import persi.futbol.Equipo;
import persi.futbol.jugador.Jugador;
import persi.futbol.jugador.Titular;
import persi.hibernate.exception.FutbolRuntimeException;

public class FormacionStrategyImpl extends Entidad implements FormacionStrategy {

	private List<Posicion> posiciones;

	public FormacionStrategyImpl() {

	}

	public FormacionStrategyImpl(final List<Posicion> posicion) {
		this.posiciones = posicion;
	}

	/**
	 * Elije como titular el mejor jugador disponible para su lista de
	 * posiciones No puede elegir para dos posiciones el mismo jugador
	 */
	@Override
	public Formacion armarFormacion(final Equipo e) {
		final List<Jugador> jugadores = new ArrayList<Jugador>(e.getJugadores());
		final Formacion formacion = new Formacion();
		for (final Posicion posicionActual : this.getPosiciones()) {
			int max = 0;
			if(jugadores.size()==0)
				throw new FutbolRuntimeException("El equipo " + e.getNombre()+ " no tiene jugadores");
			Jugador jugadorMax = jugadores.get(0);
			for (final Jugador jugador : jugadores) {
				final int valorHabilidad = jugador
						.getValorHabilidad(posicionActual);
				if (max < valorHabilidad) {
					max = valorHabilidad;
					jugadorMax = jugador;
				}
			}
			jugadores.remove(jugadorMax);
			final Titular titular = new Titular(jugadorMax, posicionActual);
			formacion.getTitulares().add(titular);
			titular.setFormacion(formacion);

		}
		formacion.agregarSuplentes(jugadores);
		return formacion;
	}

	public List<Posicion> getPosiciones() {
		return posiciones;
	}

	public void setPosiciones(final List<Posicion> posiciones) {
		this.posiciones = posiciones;
	}

}
